#ifndef BOOTOTA_H
#define BOOTOTA_H

#include <QMainWindow>
#include <QObject>
#include "ui_mainwindow.h"
#include "QSerialPort"
#include "QSerialPortInfo" //串口端口信息访问
#include <QTimer>
#include <QThread>
#include "otabase.h"
#include "otaupdatethread.h"

class BootOTA : public QMainWindow, public OTABase
{
    Q_OBJECT
public:
    explicit BootOTA(Ui::MainWindow *pui, QWidget *parent = nullptr);
    ~BootOTA();

signals:
    void OTADataReady(QByteArray byteArr);

    void OTAUpdateStart();//开始信号
    void OTAUpdateStop();// 结束的信号

private:
    void serialInit(void);
    void serialRecvTimInit();
    void serialRecvTimStart();
    void serialRecvTimStop();

    void OTASerialPortSend(QByteArray& byteArr);

    // 根据功能码处理回复
    void OTAConnectHandler(QByteArray& data);

    void OTASerialPortRecvParse(QByteArray& byteRecv);
    void OTAMessageSortProcess(QByteArray& data);

private:
    Ui::MainWindow *ui;

    QSerialPort m_serial;
    QByteArray m_SerialDataRDY; // 串口收到的数据
    quint8 m_OTAConnectCnt;
    QTimer *m_serialRecvTim;

    //  更新的线程
    OTAUpdateThread* m_OTAUpdateThread;

private slots:
    // 发送串口数据
    void onOTASerialSendDataSlot(QByteArray data);
    // 打日志
    void onOTALogSlot(QString string);
    // 设置块信息
    void onOTASetBlockSlot(qsizetype block, qsizetype fsn);
    void onOTASetAllBlockSlot(qsizetype block);

    void onBtnSerialFlushClicked();
    void onBtnSerialCtlClicked();
    void onBtnOTAConnectClicked();
    void onBtnOTAExdMsgClearClicked();

    void onSerialReceived();
    void onSerialRecvTimTimeoutSlot();

    // 更新按钮
    void onBtnOTAUpdateClicked();

protected:

};

#endif // BOOTOTA_H
